<?php

namespace application\service;

use application\entity\db\IData;
use application\entity\enu\Boolean;
use application\entity\form\IDataForm;
use application\entity\input\IDataSearch;
use application\entity\Response;
use application\model\IDataModel;
use application\service\BaseService;
use application\service\CatelogService;
use application\service\ImageService;
use core\entity\Criteria;
use core\entity\Page;
use application\util\TextUtil;
use core\util\TextUtil as TextUtilCore;

class IDataService extends BaseService {

    private $idataModel;
    private $imageService;
    private $catelogService;

    public function __construct() {
        $this->idataModel = new IDataModel();
        $this->imageService = new ImageService();
        $this->catelogService = new CatelogService();
    }

    /**
     * Chi tiết theo id
     * @param type $id
     * @return type
     */
    public function get($id) {
        $idata = $this->idataModel->ifindById($id);
        if ($idata->id != null) {
            $idata->images = $this->imageService->get($idata->id, \application\entity\enu\ImageType::IMAGE);
        }
        return $idata;
    }

    /**
     * Chi tiết theo seo url
     * @param type $seoUrl
     * @return type
     */
    public function getBySeoUrl($seoUrl) {
        $idata = $this->idataModel->getBySeoUrl($seoUrl);
        if ($idata->id != null) {
            $idata->images = $this->imageService->get($idata->id, \application\entity\enu\ImageType::IMAGE);
        }
        return $idata;
    }

    /**
     * Tìm kiếm, danh sách bài tin ảnh
     * @param IDataSearch $search
     * @return type
     */
    public function search(IDataSearch $search) {
        $cri = new Criteria();
        if (TextUtil::getVariable($search, 'id', null) != null) {
            $cri->andKey('id')->is($search->id);
        }
        if (TextUtil::getVariable($search, 'categoryId', null) != null) {
            $cri->andKey('categoryId')->is($search->categoryId);
        }
        if (TextUtil::getVariable($search, 'seoUrl', null) != null) {
            $cri->andKey('seoUrl')->is($search->seoUrl);
        }
        if (TextUtil::getVariable($search, 'keyword', null) != null) {
            $cri->match(['keyword'], $search->keyword);
        }
        if (TextUtil::getVariable($search, 'active', 0) > 0) {
            $cri->andKey('active')->is($search->active == Boolean::TRUE);
        }
        $page = new Page();
        $page->pageIndex($search->pageIndex, $search->pageSize);
        $dataPage = $this->idataModel->iSearch($cri, $page);
        $ids = [];
        foreach ($dataPage->data as $item) {
            $ids[] = $item->id;
        }
        $image = $this->imageService->getByTargetIds($ids, \application\entity\enu\ImageType::IMAGE);
        foreach ($dataPage->data as $item) {
            if (isset($image[$item->id])) {
                $item->images = $image[$item->id];
            }
        }
        return $dataPage;
    }

    /**
     * Xóa bài tin anh, bao gồm cả danh mục
     * @param type $id
     */
    public function remove($id) {
        $this->idataModel->iremove($id);
        $this->imageService->deleteByTarget($id);
    }

    /**
     * Thêm mới bài tin
     * @param \application\entity\form\IDataForm $form
     * @return \application\entity\Response
     */
    public function add(IDataForm $form) {
        $error = $this->validate($form);
        if (!empty($error)) {
            return new Response(false, "Thêm bài tin không thành công, dữ liệu không chính xác!", $error);
        }

        if (TextUtil::getVariable($form, 'seoUrl', null) != null) {
            $form->seoUrl = TextUtilCore::mb_truncate(TextUtilCore::removeMarks($form->name), 100);
        } else {
            $form->seoUrl = TextUtilCore::mb_truncate(TextUtilCore::removeMarks($form->seoUrl), 100);
        }

        $idata = new IData();
        $idata->active = $form->active == Boolean::TRUE;
        $idata->categoryId = $form->categoryId;
        $idata->detail = $form->detail;
        $idata->name = $form->name;
        $idata->createTime = time();
        $idata->updateTime = time();
        $idata->seoUrl = $form->seoUrl;
        $idata->keyword = $this->genKeyword($idata);
        $idata = $this->idataModel->isave($idata);
        if ($this->idataModel->error() != null) {
            return new Response(false, "Thêm bài tin không thành công, dữ liệu không chính xác!", $this->idataModel->error());
        }
        return new Response(true, "Thêm mới bài tin thành công", $idata);
    }

    /**
     * Cập nhật bài tin
     * @param \application\entity\form\IDataForm $form
     * @return \application\entity\Response
     */
    public function edit(IDataForm $form) {

        $idata = $this->idataModel->ifindById($form->id);
        if ($catelog->id == null) {
            return new Response(false, "Bài tin không tồn tại trên hệ thống", []);
        }

        $error = $this->validate($form);
        if (!empty($error)) {
            return new Response(false, "Cập nhật thông tin bài tin không thành công, dữ liệu không chính xác!", $error);
        }

        if (TextUtil::getVariable($form, 'seoUrl', null) != null) {
            $form->seoUrl = TextUtilCore::mb_truncate(TextUtilCore::removeMarks($form->name), 100);
        } else {
            $form->seoUrl = TextUtilCore::mb_truncate(TextUtilCore::removeMarks($form->seoUrl), 100);
        }

        $idata->active = $form->active == Boolean::TRUE;
        $idata->categoryId = $form->categoryId;
        $idata->detail = $form->detail;
        $idata->name = $form->name;
        $idata->seoUrl = $form->seoUrl;
        $idata->updateTime = time();
        $idata->keyword = $this->genKeyword($idata);
        $idata = $this->idataModel->isave($idata);
        if ($this->idataModel->error() != null) {
            return new Response(false, "Cập nhật thông tin bài tin không thành công, dữ liệu không chính xác!", $this->idataModel->error());
        }
        return new Response(true, "Cập nhật thông tin bài tin thành công", $idata);
    }

    /**
     * Gen keyword search
     * @param \application\entity\db\IData $data
     * @return type
     */
    private function genKeyword(IData $data) {
        $keyword = TextUtilCore::removeMarks($data->name . $data->categoryId);
        return $keyword;
    }

    /**
     * Validate form
     * @param \application\entity\form\IDataForm $form
     * @return string
     */
    private function validate(IDataForm $form) {
        $error = [];
        if ($form->categoryId == null || $form->categoryId == '') {
            $error['categoryId'] = "Danh mục hình ảnh chưa được chọn";
        } else {
            $catelog = $this->catelogService->get($form->categoryId);
            if ($catelog->id == null) {
                $error['categoryId'] = "Danh mục hình ảnh chọn không tồn tại trên hệ thống";
            } else if (!$catelog->leaf) {
                $error['categoryId'] = "Danh mục hình ảnh chọn không phải danh mục cấp cuối";
            }
        }
        if ($form->name == null || $form->name == '') {
            $error['name'] = "Tên bài tin chưa được nhập";
        }

        if ($form->id == null && $form->seoUrl != null && $form->seoUrl != '' && $this->idataModel->exitBySeoUrl($form->seoUrl)) {
            $error["seoUrl"] = "Url seo đã tồn tại trên hệ thống";
        }
        return $error;
    }

    /**
     * thay đổi trạng thái active của bài viết
     * @param type $id
     * @return \application\entity\Response
     */
    public function changeActive($id) {
        $idata = $this->idataModel->findById($id);
        if ($idata->id == null) {
            return new Response(false, "Bài viết bạn chọn không tồn tại");
        }
        $idata->active = !$idata->active;
        $this->idataModel->isave($idata);
        return new Response(true, "Cập nhật thành công");
    }

}
